// ----------------------------------------------------------
// This Source Code Form is subject to the terms of the
// Mozilla Public License, v.2.0. If a copy of the MPL
// was not distributed with this file, You can obtain one
// at http://mozilla.org/MPL/2.0/.
// ----------------------------------------------------------
// Codebase: https://github.com/ArKuznetsov/cpdb/
// ----------------------------------------------------------

Перем ПодключениеКСУБД;  // - ПодключениеКСУБД    - объект подключения к СУБД
Перем ТекущийСервер;     // - Строка              - адрес сервера СУБД
Перем Лог;               // - Объект              - объект записи лога приложения

#Область ПрограммныйИнтерфейс

// Проверяет существование базу на сервере СУБД
//
// Параметры:
//   База        - Строка    - имя базы
//
// Возвращаемое значение:
//   Булево    - Истина - база существует
//
Функция БазаСуществует(База) Экспорт

	Попытка
		Результат = ПодключениеКСУБД.БазаСуществует(База);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка проверки существования базы ""%1/%2"":%3%4",
		                        ТекущийСервер,
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Возврат Результат;

КонецФункции // БазаСуществует()

// Функция получает список баз с сервера СУБД
//
// Параметры:
//   ФильтрБазПоИмени    - Строка    - фильтр имен баз в формате для оператора "LIKE"
//   ФильтрПоТаблице     - Строка    - фильтр по наличию в базе данных таблицы с указанным именем
//   ВключаяСистемные    - Булево    - Истина - в результат будут включены системные базы данных
//                                     (master, model, tempdb, msdb)
//
// Возвращаемое значение:
//   Соответствие Из Структура           - список баз на сервере СУБД
//     * Имя                   - Строка    - имя базы данных
//     * Ид                    - Число     - идентификатор базы данных
//     * ИдСоздателя           - Число     - идентификатор пользователя, создавшего базу
//     * Статус1               - Число     - флаги состояния базы данных
//     * Статус2               - Число     - флаги состояния базы данных
//     * ДатаСоздания          - Строка    - дата создания базы данных
//     * РежимСовместимости    - Число     - версия режима совместимости базы
//     * ФайлДанных            - Строка    - путь к файлу данных
//
Функция СписокБаз(ФильтрБазПоИмени = "", ФильтрПоТаблице = "", ВключаяСистемные = Ложь) Экспорт

	Лог.Отладка("Начало получения списка баз на сервере ""%1""", ТекущийСервер);

	Попытка
		Результат = ПодключениеКСУБД.СписокБаз(ФильтрБазПоИмени, ФильтрПоТаблице, ВключаяСистемные);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка получения списка баз на сервере ""%1"":%2%3",
		                        ТекущийСервер,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Получен список баз на сервере ""%1""", ТекущийСервер);

	Возврат Результат;

КонецФункции // СписокБаз()

// Функция проверяет существование таблицы в базе на сервере СУБД
//
// Параметры:
//   База       - Строка    - имя базы данных
//   Таблица    - Строка    - имя таблицы базы данных
//
// Возвращаемое значение:
//   Булево    - Истина - таблица существует в базе данных
//
Функция ТаблицаСуществует(База, Таблица) Экспорт

	Попытка
		Результат = ПодключениеКСУБД.ТаблицаСуществует(База, Таблица);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка проверки существования таблицы ""%1"" в базе ""%2/%3"":%4%5",
		                        Таблица,
		                        ТекущийСервер,
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Возврат Результат;

КонецФункции // ТаблицаСуществует()

// Создает базу данных
//
// Параметры:
//   База                    - Строка    - имя базы
//   МодельВосстановления    - Строка    - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED)
//   ПутьККаталогу           - Строка    - путь к каталогу для размещения файлов базы данных
//                                         если не указан, то файлы размещаются в каталоге по умолчанию SQL Server
//
Процедура СоздатьБазуДанных(База, МодельВосстановления = "FULL", ПутьККаталогу = "") Экспорт

	Лог.Отладка("Начало создания базы ""%1/%2""", ТекущийСервер, База);

	Попытка
		ПодключениеКСУБД.СоздатьБазу(База, МодельВосстановления, ПутьККаталогу);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1/%2"":%3%4",
		                        ТекущийСервер,
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Создана база данных ""%1/%2""", ТекущийСервер, База);

КонецПроцедуры // СоздатьБазуДанных()

// Удаляет базу данных
//
// Параметры:
//   База                    - Строка    - имя базы
//
Процедура УдалитьБазуДанных(База) Экспорт

	Лог.Отладка("Начало удаления базы ""%1/%2""", ТекущийСервер, База);

	Попытка
		ПодключениеКСУБД.УдалитьБазу(База);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка удаления базы данных ""%1/%2"":%3%4",
		                        ТекущийСервер,
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Удалена база данных ""%1/%2""", ТекущийСервер, База);

КонецПроцедуры // УдалитьБазуДанных()

// Процедура переводит базу данных в однопользовательский режим
//
// Параметры:
//   База                    - Строка    - имя базы
//
Процедура УстановитьОднопользовательскийРежимБазы(База) Экспорт

	Лог.Отладка("Начало перевода базы ""%1/%2"" в однопользовательский режим", ТекущийСервер, База);

	Попытка
		ПодключениеКСУБД.УстановитьОднопользовательскийРежимБазы(База);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка перевода базы данных ""%1/%2"" в однопользовательский режим:%3%4",
		                        ТекущийСервер,
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("База данных ""%1/%2"" переведена в однопользовательский режим", ТекущийСервер, База);

КонецПроцедуры // УстановитьОднопользовательскийРежимБазы()

// Процедура переводит базу данных в многопользовательский режим
//
// Параметры:
//   База                    - Строка    - имя базы
//
Процедура УстановитьМногопользовательскийРежимБазы(База) Экспорт

	Лог.Отладка("Начало перевода базы ""%1/%2"" в многопользовательский режим", ТекущийСервер, База);

	Попытка
		ПодключениеКСУБД.УстановитьМногопользовательскийРежимБазы(База);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка перевода базы данных ""%1/%2"" в многопользовательский режим:%3%4",
		                        ТекущийСервер,
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("База данных ""%1/%2"" переведена в многопользовательский режим", ТекущийСервер, База);

КонецПроцедуры // УстановитьМногопользовательскийРежимБазы()

// Выполняет резервное копирование базы
//
// Параметры:
//   База                    - Строка             - имя базы
//   ПутьКРезервнойКопии     - Строка             - путь к файлу резервной копии
//
Процедура ВыполнитьРезервноеКопирование(База, ПутьКРезервнойКопии) Экспорт

	Лог.Отладка("Начало создания резервной копии ""%1"" базы ""%2/%3""",
	            ПутьКРезервнойКопии,
	            ТекущийСервер,
	            База);

	Попытка
		ПодключениеКСУБД.СоздатьРезервнуюКопию(База, ПутьКРезервнойКопии);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка создания резервной копии ""%1"" базы ""%2/%3"": %4%5",
		                        ПутьКРезервнойКопии,
		                        ТекущийСервер,
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Создана резервная копия ""%1"" базы ""%2/%3""",
	            ПутьКРезервнойКопии,
	            ТекущийСервер,
	            База);

КонецПроцедуры // ВыполнитьРезервноеКопирование()

// Выполняет восстановление базы из резервной копии
//
// Параметры:
//   База                    - Строка             - имя базы
//   ПутьКРезервнойКопии     - Строка             - путь к файлу резервной копии
//   ПутьКФайлуДанных        - Строка             - путь к файлу данных базы
//   ПутьКФайлуЖурнала       - Строка             - путь к файлу журнала транзакций базы
//   СоздаватьБазу           - Булево             - Истина - создать базу в случае отсутствия
//
Процедура ВыполнитьВосстановление(База,
                                  ПутьКРезервнойКопии,
                                  ПутьКФайлуДанных,
                                  ПутьКФайлуЖурнала,
                                  СоздаватьБазу) Экспорт

	Лог.Отладка("Начало восстановления базы ""%1/%2"" из резервной копии ""%3""",
	            ТекущийСервер,
	            База,
	            ПутьКРезервнойКопии);

	Попытка
		ПодключениеКСУБД.ВосстановитьИзРезервнойКопии(База,
		                                              ПутьКРезервнойКопии,
		                                              ПутьКФайлуДанных,
		                                              ПутьКФайлуЖурнала,
		                                              СоздаватьБазу);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2"": %3%4",
		                        База,
		                        ПутьКРезервнойКопии,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Выполнено восстановление базы ""%1"" из резервной копии ""%2""",
	            База,
	            ПутьКРезервнойКопии);

КонецПроцедуры // ВыполнитьВосстановление()

// Функция получает описание базы данных
//
// Параметры:
//   База    - Строка    - имя базы данных
//
// Возвращаемое значение:
//   Структура                              - описание базы данных
//     *Имя                                   - Строка  - имя базы данных (name)
//     *Ид                                    - Число   - числовой идентификатор базы (database_id)
//     *ФизическоеИмя                         - Строка  - физическое имя базы (physical_database_name)
//     *Владелец                              - Строка  - пользователь - владелец базы (db owner)
//     *ДатаСоздания                          - Дата    - дата создания базы (create_date)
//     *РежимСовместимости                    - Число   - режим совместимости базы (версия MS SQL) (compatibility_level)
//     *ЯзыковыеУстановки                     - Строка  - используемые языковые установки (collation_name)
//     *РежимДоступа                          - Булево  - режим пользовательского доступа к базе
//                                                        (SINGLE_USER, MULTI_USER) (user_access_desc)
//     *ТолькоДляЧтения                       - Булево  - флаг режима только для чтения (is_read_only)
//     *Состояние                             - Строка  - состояние базы (ONLINE, OFFLINE) (state_desc)
//     *РежимОжидания                         - Булево  - флаг нахождения базы в режиме ожидания (is_in_standby)
//     *РежимИзоляцииСнимков                  - Булево  - флаг использования режима изоляции снимков
//                                                        (snapshot_isolation_state)
//     *РежимФиксированногоЧтенияСнимков      - Булево  - флаг использования фиксированного чтения снимков
//                                                        (is_read_committed_snapshot_on)
//     *МодельВосстановления                  - Строка  - модель восстановления базы (FULL, SIMPLE, BULK_LOGGED)
//                                                        (recovery_model_desc)
//     *АвтоСозданиеСтатистики                - Булево  - флаг автоматического создания статистики
//                                                        (is_auto_create_stats_on)
//     *АвтоСозданиеСтатистикиИнкрементально  - Булево  - флаг автоматического инкрементального создания статистики
//                                                        (is_auto_create_stats_incremental_on)
//     *АвтоОбновлениеСтатистики              - Булево  - флаг автоматического обновления статистики
//                                                        (is_auto_update_stats_on)
//     *АвтоОбновлениеСтатистикиАсинх         - Булево  - флаг автоматического асинхронного обновления статистики
//                                                        (is_auto_update_stats_async_on)
//     *ПолнотекстовыйПоиск                   - Булево  - флаг использования полнотекстового поиска
//                                                        (is_fulltext_enabled)
//     *Шифрование                            - Булево  - флаг использования шифрования базы (is_encrypted)
//
Функция ПолучитьОписание(База) Экспорт

	Лог.Отладка("Начало получения описания базы ""%1"":%2%3", База);

	Попытка
		Результат = ПодключениеКСУБД.ПолучитьОписаниеБазы(База);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка получения описания базы ""%1"":%2%3",
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Получено описание базы ""%1""", База);

	Возврат Результат;

КонецФункции // ПолучитьОписание()

// Получает текущего владельца базы
//
// Параметры:
//   База    - Строка    - имя базы данных
//
// Возвращаемое значение:
//   Строка    - имя текущего владельца базы
//
Функция ПолучитьВладельца(База) Экспорт

	ОписаниеБазы = ПолучитьОписание(База);

	Возврат ОписаниеБазы.Владелец;

КонецФункции // ПолучитьВладельца()

// Устанавливает нового владельца базы
//
// Параметры:
//   База                - Строка             - имя базы
//   ВладелецБазы        - Строка             - новый владелец базы
//
Процедура ИзменитьВладельца(База, ВладелецБазы) Экспорт

	Лог.Отладка("Начало установки владельца ""%1"" лля базы ""%2""",
	            ВладелецБазы,
	            База);

	Попытка
		ПодключениеКСУБД.УстановитьВладельцаБазы(База, ВладелецБазы);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка смены владельца базы ""%1"" на ""%2"":%3%4",
		                        База,
		                        ВладелецБазы,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Для базы ""%1"" установлен новый владелец ""%2""",
	            База,
	            ВладелецБазы);

КонецПроцедуры // ИзменитьВладельца()

// Получает модель восстановления базы (FULL, SIMPLE, BULK_LOGGED)
//
// Параметры:
//   База    - Строка    - имя базы данных
//
// Возвращаемое значение:
//   Строка    - текущая модель восстановления базы
//
Функция ПолучитьМодельВосстановления(База) Экспорт

	ОписаниеБазы = ПолучитьОписание(База);

	Возврат ВРег(ОписаниеБазы.МодельВосстановления);

КонецФункции // ПолучитьМодельВосстановления()

// Устанавливает модель восстановления базы (FULL, SIMPLE, BULK_LOGGED)
//
// Параметры:
//   База                   - Строка             - имя базы
//   МодельВосстановления   - Строка             - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED)
//
Процедура ИзменитьМодельВосстановления(База, МодельВосстановления) Экспорт

	Лог.Отладка("Начало установки модели восстановления ""%1"" для базы ""%2""",
	            МодельВосстановления,
	            База);

	Попытка
		ПодключениеКСУБД.УстановитьМодельВосстановления(База, МодельВосстановления);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка смены модели восстановления базы ""%1"" на ""%2"":%3%4",
		                        База,
		                        МодельВосстановления,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Для базы ""%1"" установлена модель восстановления ""%2""",
	            База,
	            МодельВосстановления);

КонецПроцедуры // ИзменитьМодельВосстановления()

// Получает логическое имя файла в базе
//
// Параметры:
//   База        - Строка    - имя базы данных
//   ТипФайла    - Строка    - ROWS - файл базы; LOG - файл журнала транзакций
//
// Возвращаемое значение:
//   Строка     - логическое имя файла в базе данных
//
Функция ПолучитьЛогическоеИмяФайла(База, Знач ТипФайла = "ROWS") Экспорт

	ТипФайлаПредставление = "неизвестного типа";

	ТипФайла = ВРег(ТипФайла);

	Если ТипФайла = "ROWS" ИЛИ ТипФайла = "D" Тогда
		ТипФайлаПредставление = "данных";
	ИначеЕсли ТипФайла = "LOG" ИЛИ ТипФайла = "L" Тогда
		ТипФайлаПредставление = "журнала";
	Иначе
		Возврат Неопределено;
	КонецЕсли;

	Лог.Отладка("Начало получения логического имени файла %1 для базы ""%2""",
	            ТипФайлаПредставление,
	            База);

	Результат = Неопределено;

	Попытка
		Результат = ПодключениеКСУБД.ПолучитьЛогическоеИмяФайлаВБазе(База, ТипФайла);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в базе ""%2"":%3%4",
		                        ТипФайлаПредставление,
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Если Результат = Неопределено Тогда
		ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в базе ""%2""",
		                        ТипФайлаПредставление,
		                        База);
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;

	Лог.Отладка("Получено логическое имя ""%1"" файла %2 для базы ""%3""",
	            Результат,
	            ТипФайлаПредставление,
	            База);

	Возврат Результат;

КонецФункции // ПолучитьЛогическоеИмяФайла()

// Устанавливает новое логическое имя файла базы
//
// Параметры:
//   База        - Строка    - имя базы данных
//   Имя         - Строка    - логическое имя изменяемого файла
//   НовоеИмя    - Строка    - новое логическое имя
//
Процедура ИзменитьЛогическоеИмяФайла(База, Имя, НовоеИмя) Экспорт

	Лог.Отладка("Начало изменения логического имени файла ""%1"" на ""%2"" в базе ""%3""",
	            Имя,
	            НовоеИмя,
	            База);

	Если Имя = НовоеИмя Тогда
		Возврат;
	КонецЕсли;

	Попытка
		ПодключениеКСУБД.ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла ""%1"" на ""%2"" в базе ""%3"":%4%5",
		                        Имя,
		                        НовоеИмя,
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Изменено логическое имя файла ""%1"" на ""%2"" в базе ""%3""",
	            Имя,
	            НовоеИмя,
	            База);

КонецПроцедуры // ИзменитьЛогическоеИмяФайла()

// Устанавливает логические имена файлов в формате:
//   <НовоеИмя> - для файла данных
//   <НовоеИмя>_log - для файла журнала транзакций
//
// Параметры:
//   База        - Строка    - имя базы данных
//   НовоеИмя    - Строка    - новое имя файлов, если не указано, то используется имя базы данных
//
Процедура УстановитьЛогическиеИменаФайлов(База, Знач НовоеИмя = "") Экспорт

	Если НЕ ЗначениеЗаполнено(НовоеИмя) Тогда
		НовоеИмя = База;
	КонецЕсли;

	ЛИФДанных = ПолучитьЛогическоеИмяФайла(База, "ROWS");
	НовоеЛИФДанных = НовоеИмя;

	ИзменитьЛогическоеИмяФайла(База, ЛИФДанных, НовоеЛИФДанных);
	
	ЛИФЖурнала = ПолучитьЛогическоеИмяФайла(База, "LOG");
	НовоеЛИФЖурнала = СтрШаблон("%1_log", НовоеИмя);

	ИзменитьЛогическоеИмяФайла(База, ЛИФЖурнала, НовоеЛИФЖурнала);

КонецПроцедуры // УстановитьЛогическиеИменаФайлов()

// Включает компрессию данных базы на уровне страниц
//
// Параметры:
//   База                - Строка             - имя базы
//
Процедура ВключитьКомпрессию(База) Экспорт

	Лог.Отладка("Начало компрессии страниц базы ""%1""", База);

	Попытка
		ПодключениеКСУБД.ВключитьКомпрессиюСтраниц(База, Истина, Истина);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка включения компрессии страниц в базе ""%1"": ""%2""",
		                        База,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Включена компрессия страниц в базе ""%1""", База);

КонецПроцедуры // ВключитьКомпрессию()

// Выполняет сжатие базы (shrink)
//
// Параметры:
//   База                - Строка             - имя базы
//
Процедура СжатьБазу(База) Экспорт

	Лог.Отладка("Начало сжатия (shrink) файла данных базы ""%1""", База);

	Попытка
		ПодключениеКСУБД.СжатьБазу(База);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка сжатия (shrink) файла данных базы ""%1"":%2%3",
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Выполнено сжатие (shrink) файла данных базы ""%1""", База);

КонецПроцедуры // СжатьБазу()

// Выполняет сжатие файла лога (shrink)
//
// Параметры:
//   База                - Строка             - имя базы
//
Процедура СжатьФайлЖурналаТранзакций(База) Экспорт

	Лог.Отладка("Начало сжатия (shrink) файла журнала транзакций базы ""%1""", База);

	Попытка
		ПодключениеКСУБД.СжатьФайлЖурналаТранзакций(База);
	Исключение
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ТекстОшибки = СтрШаблон("Ошибка сжатия (shrink) файла журнала транзакций базы ""%1"":%2%3",
		                        База,
		                        Символы.ПС,
		                        ТекстОшибки);
		ВызватьИсключение ТекстОшибки;
	КонецПопытки;

	Лог.Отладка("Выполнено сжатие (shrink) файла журнала транзакций базы ""%1""", База);

КонецПроцедуры // СжатьФайлЖурналаТранзакций()

// Функция выполняет указанные скрипты
//
// Параметры:
//    СкриптыВыполнения  - Строка - пути к файлам скриптов, разделенные ";"
//    СтрокаПеременных   - Строка - набор значений переменных в виде "<Имя>=<Значение>", разделенные ";"
//
// Возвращаемое значение:
//    Строка    - результат выполнения скриптов
//
Функция ВыполнитьСкрипты(СкриптыВыполнения, СтрокаПеременных = "") Экспорт
	
	МассивСкриптов = СтрРазделить(СкриптыВыполнения, ";", Ложь);
	МассивПеременных = СтрРазделить(СтрокаПеременных, ";", Ложь);
	
	Лог.Отладка("Начало выполнения скриптов ""%1"", со значениями переменных ""%2""",
	            СкриптыВыполнения,
	            СтрокаПеременных);

	РезультатЗапроса = "";
	
	КодВозврата = ПодключениеКСУБД.ВыполнитьСкриптыЗапросСУБД(МассивСкриптов, МассивПеременных, РезультатЗапроса);

	Если НЕ КодВозврата = 0 Тогда
		ТекстОшибки = СтрШаблон("Ошибка выполнения скриптов ""%1"" со значениями переменных ""%2""
		                        |на сервере ""%3"", код возврата %4: %5%6",
		                        СкриптыВыполнения,
		                        СтрокаПеременных,
		                        ТекущийСервер,
		                        КодВозврата,
		                        Символы.ПС,
		                        РезультатЗапроса); 
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;

	СтрокаРезультата = "";

	Если ЗначениеЗаполнено(РезультатЗапроса) Тогда
		СтрокаРезультата = СтрШаблон(", результатЖ %1%2", Символы.ПС, РезультатЗапроса);
	КонецЕсли;

	Лог.Отладка("Выполнены скрипты ""%1"" со значениями переменных ""%2""%3",
	            СкриптыВыполнения,
	            СтрокаПеременных,
	            СтрокаРезультата);

	Возврат РезультатЗапроса;

КонецФункции // ВыполнитьСкрипты()

// Функция выполняет запрос к СУБД
//
// Параметры:
//    ТекстЗапроса           - Строка       - текст исполняемого запроса
//    Разделитель            - Строка       - символ - разделитель колонок результата
//    УбратьПробелы          - Булево       - Истина - будут убраны выравнивающие пробелы из результата
//
// Возвращаемое значение:
//    Строка    - результат выполнения запроса
//
Функция ВыполнитьЗапрос(ТекстЗапроса, Разделитель = "", УбратьПробелы = Ложь) Экспорт
	
	ОписаниеРезультата = "";
	
	КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата, Разделитель, УбратьПробелы);
	Если КодВозврата = 0 Тогда
		Если ЗначениеЗаполнено(ОписаниеРезультата) Тогда
			Лог.Отладка("Результат выполнения:%1%2", Символы.ПС, ОписаниеРезультата);
		КонецЕсли;
	Иначе
		ТекстОшибки = СтрШаблон("Ошибка выполнения запроса ""%1"" на сервере ""%2"", код возврата %3: %4%5",
		                        ТекстЗапроса,
		                        ТекущийСервер,
		                        КодВозврата,
		                        Символы.ПС,
		                        ОписаниеРезультата); 
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;

	Возврат ОписаниеРезультата;

КонецФункции // ВыполнитьЗапрос()

#КонецОбласти // ПрограммныйИнтерфейс

#Область ОбработчикиСобытий

// Процедура - обработчик события "ПриСозданииОбъекта"
//
// Параметры:
//    _ПодключениеКСУБД    - ПодключениеКСУБД    - объект подключения к СУБД
//
// BSLLS:UnusedLocalMethod-off
Процедура ПриСозданииОбъекта(Знач _ПодключениеКСУБД)

	ПодключениеКСУБД = _ПодключениеКСУБД;
	ТекущийСервер = ПодключениеКСУБД.Сервер();

	Лог = ПараметрыСистемы.Лог();

КонецПроцедуры // ПриСозданииОбъекта()
// BSLLS:UnusedLocalMethod-on

#КонецОбласти // ОбработчикиСобытий
